purpose of notebook
  1. summarize all insights and ideas from the other notebooks, as well as good exploratory plots
information

name: makeovermonday_2021w22 link: https://data.world/makeovermonday/2021w22 title: 2021/W22: The Plastic Waste Makers Index Data Source: Minderoo

domain information
  1. Production of single-use plastic (SUP) and contribution to single-use plastic waste is estimated and calculated in million metric tons in 2019.
  2. Rigid packaging is packaging that features heavier and often stronger materials than flexible packaging. Forms of rigid packaging materials include but are not limited to: glass, hard plastics, cardboard, metal, and so on. Rigid packaging supplies are usually more expensive than their flexible alternatives and most have significantly higher carbon footprints than flexible packaging. see https://www.industrialpackaging.com/blog/flexible-vs-rigid-packaging
  3. Flexible packaging includes all malleable packaging. Some common examples of flexible packaging include shrink film, stretch film, flexible pouches, seal bands, blister or skin packs, and clamshells. In reality, flexible packaging includes any protective packaging made from materials including plastic, paperboard, paper, foil, wax-coated paperboard, and similar materials, or combinations of these materials. see https://www.industrialpackaging.com/blog/flexible-vs-rigid-packaging
  4. In-scope polymersSingle-use plastics can, in theory, be produced from over a dozen polymer families. However, in 2019, we estimate that close to 90 per cent of all single-use plastics by mass were produced from just five polymers: polypropylene (PP), high-density polyethylene (HDPE), low-density polyethylene (LDPE), linear low-density polyethylene (LLDPE), and polyethylene terephthalate resin (PET) (Figure M2). see https://cdn.minderoo.org/content/uploads/2021/05/18065501/20210518-Plastic-Waste-Makers-Index.pdf
summary highlights
stories
load packages
overview
head(plastic)
summary(plastic)
      rank        polymer_producer    no_of_assets   production_of_in_scope_polymers flexible_format_contribution_to_sup_waste rigid_format_contribution_to_sup_waste
 Min.   :  1.00   Length:100         Min.   : 0.00   Min.   : 0.200                  Min.   :0.000                             Min.   :0.000                         
 1st Qu.: 25.75   Class :character   1st Qu.: 3.00   1st Qu.: 0.500                  1st Qu.:0.100                             1st Qu.:0.100                         
 Median : 50.50   Mode  :character   Median : 6.00   Median : 0.900                  Median :0.200                             Median :0.200                         
 Mean   : 50.50                      Mean   :11.56   Mean   : 1.805                  Mean   :0.538                             Mean   :0.416                         
 3rd Qu.: 75.25                      3rd Qu.:12.25   3rd Qu.: 1.700                  3rd Qu.:0.500                             3rd Qu.:0.500                         
 Max.   :100.00                      Max.   :82.00   Max.   :11.600                  Max.   :4.700                             Max.   :4.500                         
 total_contribution_to_sup_waste
 Min.   :0.200                  
 1st Qu.:0.300                  
 Median :0.450                  
 Mean   :0.950                  
 3rd Qu.:0.925                  
 Max.   :5.900                  
observations from clean nb
  1. columns: rank numeric, ordered, unique, can serve as identifier, rank of producer according to index polymer_producer string, unique identifier, name of producer no_of_assets numeric, metric, number of assets of the producer production_of_in_scope_polymers numeric, metric in million metric tons, production of plolymers that are in-scope of preceding analysis flexible_format_contribution_to_sup_waste numeric, metric in million metric tons, flexible form of contribution to sup waste rigid_format_contribution_to_sup_waste numeric, metric in million metric tons, rigid form of contribution to sup waste total_contribution_to_sup_waste numeric, metric in million metric tons, total contribution is the sum of flexible and rigid
  2. no missing values at all, also it is a very small dataset
  3. no duplicated rows
  4. no changes were made to data set
insights from describe uni
  1. no_of_assets is poisson distributed, where most producer only have up to 9 (median = 6) assets, some have up to 29 (upper fence = 26), and only a few (outliers) are above that with up to 82 assets
  2. production_of_in_scope_polymers is poisson distributed, likes very similar to no_of_assets, median is 0.9, upper fence is 3.4, max is 11.6 -> might correlate with no_of_assets?
  3. flexible_format_contribution_to_sup_waste is poisson distributed, likes very similar to no_of_assets, median is 0.2, upper fence is 1.1, max is 4.7
  4. rigid_format_contribution_to_sup_waste is poisson distributed, likes very similar to no_of_assets, median is 0.2, upper fence is 1.1, max is 4.5, very similar to flexible_format_contribution_to_sup_waste, but with less outliers
  5. rigid_format_contribution_to_sup_waste is poisson distributed, likes very similar to no_of_assets (again), median is 0.45, upper fence is 1.9, max is 5.9 is sum of flexible_form + rigid_form
  6. ration of sup_waste to produced polymers is between min 0.3 and max 1.0 and has median 0.5, most data lies between 0.4 and 0.6, but there is a high spike at 1.0 (with count 15)
  7. comparing rigid_format and flexible_format shows that up to the upper fence 1.1, the distribution is similar, but there are more bigger (>3) outliers in flexible
name = 'total_contribution_to_sup_waste'
df <- plastic %>% rename(value = total_contribution_to_sup_waste) %>% select(value)

# https://ggplot2.tidyverse.org/reference/geom_dotplot.html
dotplot <- df %>%
  ggplot(aes(x = value)) +
    # geom_density() +
    geom_histogram(binwidth = 0.1) +
    # geom_dotplot(method="histodot", stackgroups = TRUE, stackratio = 1.1, dotsize = 1.2, binwidth = 1) +
    theme_minimal() +
    scale_y_continuous(breaks = NULL) 
dotplot <- ggplotly(dotplot) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))

boxplot <- df %>%
  ggplot(aes(x = 1, y = value)) +
    geom_boxplot() +
    theme_minimal() +
    coord_flip() +
    ggtitle(paste("distribution of", name, sep=" ")) +
    scale_y_continuous(breaks = NULL) 
boxplot <- ggplotly(boxplot) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))

# https://ggplot2.tidyverse.org/reference/geom_qq.html 
plot_qq <- df %>%
  ggplot(aes(sample = value)) +
    geom_qq(alpha = 0.5) +
    geom_qq_line() +
    coord_flip() +
    theme_minimal()
plot_qq <- ggplotly(plot_qq) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))

# https://plotly.com/r/subplots/
fig <- subplot(dotplot, boxplot, plot_qq, nrows = 3, margin = 0, heights = c(0.5, 0.2, 0.3), shareX = TRUE) 

fig
name = c('flexible_format_contribution_to_sup_waste', 'rigid_format_contribution_to_sup_waste')
df <- plastic %>% rename(flexible = flexible_format_contribution_to_sup_waste, rigid = rigid_format_contribution_to_sup_waste) %>% select(flexible, rigid) %>% pivot_longer(cols = c(flexible,rigid))

boxplot <- df %>%
  ggplot(aes(x = name, y = value, colour = name)) +
    geom_boxplot() +
    theme_minimal() +
    coord_flip() +
    ggtitle(paste("compare ", name[1], "and", name[2], sep=" ")) +
    scale_y_continuous(breaks = NULL) 
boxplot <- ggplotly(boxplot) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))

# https://ggplot2.tidyverse.org/reference/geom_dotplot.html
dotplot <- df %>%
  ggplot(aes(x = value, fill = name)) +
    # geom_density() +
    geom_histogram(binwidth = 0.1, alpha = 0.5, position = "identity") +
    # geom_dotplot(method="histodot", stackgroups = TRUE, stackratio = 1, dotsize = 0.23, binwidth = 0.1) +
    theme_minimal() +
    scale_y_continuous(breaks = NULL) 
dotplot <- ggplotly(dotplot) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))

# https://ggplot2.tidyverse.org/reference/geom_qq.html 
plot_qq <- df %>%
  ggplot(aes(sample = value, colour = name)) +
    geom_qq(alpha = 0.5) +
    geom_qq_line(alpha = 0.5) +
    coord_flip() +
    theme_minimal() 
plot_qq <- ggplotly(plot_qq) %>% layout(yaxis = list(showticklabels = FALSE, showgrid = FALSE))

# https://plotly.com/r/subplots/
fig <- subplot(dotplot, boxplot, plot_qq, nrows = 3, margin = 0, heights = c(0.5, 0.2, 0.3), shareX = TRUE) 

fig
insights from describe multi
LS0tDQp0aXRsZTogInN1bW1hcnkgZm9yIHBsYXN0aWMgd2FzdGUgbWFrZXJzIGluZGV4IGRhdGEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQotLS0NCnB1cnBvc2Ugb2Ygbm90ZWJvb2sNCi0tLQ0KDQogIChpKSBzdW1tYXJpemUgYWxsIGluc2lnaHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBvdGhlciBub3RlYm9va3MsIGFzIHdlbGwgYXMgZ29vZCBleHBsb3JhdG9yeSBwbG90cw0KICANCi0tLQ0KaW5mb3JtYXRpb24NCi0tLQ0KDQpuYW1lOiBtYWtlb3Zlcm1vbmRheV8yMDIxdzIyDQpsaW5rOiBodHRwczovL2RhdGEud29ybGQvbWFrZW92ZXJtb25kYXkvMjAyMXcyMg0KdGl0bGU6IDIwMjEvVzIyOiBUaGUgUGxhc3RpYyBXYXN0ZSBNYWtlcnMgSW5kZXgNCkRhdGEgU291cmNlOiBbTWluZGVyb29dKGh0dHBzOi8vd3d3Lm1pbmRlcm9vLm9yZy9wbGFzdGljLXdhc3RlLW1ha2Vycy1pbmRleC9kYXRhL2luZGljZXMvcHJvZHVjZXJzLykNCg0KDQotLS0NCmRvbWFpbiBpbmZvcm1hdGlvbiANCi0tLQ0KDQogKGkpIFByb2R1Y3Rpb24gb2Ygc2luZ2xlLXVzZSBwbGFzdGljIChTVVApIGFuZCBjb250cmlidXRpb24gdG8gc2luZ2xlLXVzZSBwbGFzdGljIHdhc3RlIGlzIGVzdGltYXRlZCBhbmQgY2FsY3VsYXRlZCBpbiBtaWxsaW9uIG1ldHJpYyB0b25zIGluIDIwMTkuDQogKGkpIFJpZ2lkIHBhY2thZ2luZyBpcyBwYWNrYWdpbmcgdGhhdCBmZWF0dXJlcyBoZWF2aWVyIGFuZCBvZnRlbiBzdHJvbmdlciBtYXRlcmlhbHMgdGhhbiBmbGV4aWJsZSBwYWNrYWdpbmcuIEZvcm1zIG9mIHJpZ2lkIHBhY2thZ2luZyBtYXRlcmlhbHMgaW5jbHVkZSBidXQgYXJlIG5vdCBsaW1pdGVkIHRvOiBnbGFzcywgICAgICBoYXJkIHBsYXN0aWNzLCBjYXJkYm9hcmQsIG1ldGFsLCBhbmQgc28gb24uIFJpZ2lkIHBhY2thZ2luZyBzdXBwbGllcyBhcmUgdXN1YWxseSBtb3JlIGV4cGVuc2l2ZSB0aGFuIHRoZWlyIGZsZXhpYmxlIGFsdGVybmF0aXZlcyBhbmQgbW9zdCBoYXZlIHNpZ25pZmljYW50bHkgaGlnaGVyIGNhcmJvbiAgICAgICAgICAgICAgZm9vdHByaW50cyB0aGFuIGZsZXhpYmxlIHBhY2thZ2luZy4gc2VlIGh0dHBzOi8vd3d3LmluZHVzdHJpYWxwYWNrYWdpbmcuY29tL2Jsb2cvZmxleGlibGUtdnMtcmlnaWQtcGFja2FnaW5nDQogKGkpIEZsZXhpYmxlIHBhY2thZ2luZyBpbmNsdWRlcyBhbGwgbWFsbGVhYmxlIHBhY2thZ2luZy4gU29tZSBjb21tb24gZXhhbXBsZXMgb2YgZmxleGlibGUgcGFja2FnaW5nIGluY2x1ZGUgc2hyaW5rIGZpbG0sIHN0cmV0Y2ggZmlsbSwgZmxleGlibGUgcG91Y2hlcywgc2VhbCBiYW5kcywgYmxpc3RlciBvciBza2luICAgICAgICBwYWNrcywgYW5kIGNsYW1zaGVsbHMuIEluIHJlYWxpdHksIGZsZXhpYmxlIHBhY2thZ2luZyBpbmNsdWRlcyBhbnkgcHJvdGVjdGl2ZSBwYWNrYWdpbmcgbWFkZSBmcm9tIG1hdGVyaWFscyBpbmNsdWRpbmcgcGxhc3RpYywgcGFwZXJib2FyZCwgcGFwZXIsIGZvaWwsIHdheC1jb2F0ZWQgcGFwZXJib2FyZCwgYW5kICAgICAgc2ltaWxhciBtYXRlcmlhbHMsIG9yIGNvbWJpbmF0aW9ucyBvZiB0aGVzZSBtYXRlcmlhbHMuIHNlZSBodHRwczovL3d3dy5pbmR1c3RyaWFscGFja2FnaW5nLmNvbS9ibG9nL2ZsZXhpYmxlLXZzLXJpZ2lkLXBhY2thZ2luZw0KIChpKSBJbi1zY29wZSBwb2x5bWVyc1NpbmdsZS11c2UgcGxhc3RpY3MgY2FuLCBpbiB0aGVvcnksIGJlIHByb2R1Y2VkIGZyb20gb3ZlciBhIGRvemVuIHBvbHltZXIgZmFtaWxpZXMuIEhvd2V2ZXIsIGluIDIwMTksIHdlIGVzdGltYXRlIHRoYXQgY2xvc2UgdG8gOTAgcGVyIGNlbnQgb2YgYWxsIHNpbmdsZS11c2UgICAgICAgICAgcGxhc3RpY3MgYnkgbWFzcyB3ZXJlIHByb2R1Y2VkIGZyb20ganVzdCBmaXZlIHBvbHltZXJzOiBwb2x5cHJvcHlsZW5lIChQUCksIGhpZ2gtZGVuc2l0eSBwb2x5ZXRoeWxlbmUgKEhEUEUpLCBsb3ctZGVuc2l0eSBwb2x5ZXRoeWxlbmUgKExEUEUpLCBsaW5lYXIgbG93LWRlbnNpdHkgcG9seWV0aHlsZW5lICAgICAgICAgIChMTERQRSksIGFuZCBwb2x5ZXRoeWxlbmUgdGVyZXBodGhhbGF0ZSByZXNpbiAoUEVUKSAoRmlndXJlIE0yKS4gc2VlIGh0dHBzOi8vY2RuLm1pbmRlcm9vLm9yZy9jb250ZW50L3VwbG9hZHMvMjAyMS8wNS8xODA2NTUwMS8yMDIxMDUxOC1QbGFzdGljLVdhc3RlLU1ha2Vycy1JbmRleC5wZGYNCiAgDQotLS0NCnN1bW1hcnkgaGlnaGxpZ2h0cw0KLS0tDQogIA0KDQoNCi0tLQ0Kc3Rvcmllcw0KLS0tDQoNCg0KDQotLS0NCmxvYWQgcGFja2FnZXMNCi0tLQ0KYGBge3IgbG9hZCBwYWNrYWdlcywgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKSAjIHRpZHkgZGF0YSBmcmFtZQ0KbGlicmFyeShwbG90bHkpICMgbWFrZSBnZ3Bsb3RzIGludGVyYWN0aXZlDQpgYGANCg0KLS0tDQpvdmVydmlldw0KLS0tDQpgYGB7cn0NCmhlYWQocGxhc3RpYykNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkocGxhc3RpYykNCmBgYA0KDQotLS0NCm9ic2VydmF0aW9ucyBmcm9tIGNsZWFuIG5iDQotLS0NCg0KICAoaSkgY29sdW1uczogcmFuayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpYywgb3JkZXJlZCwgdW5pcXVlLCBjYW4gc2VydmUgYXMgaWRlbnRpZmllciwgcmFuayBvZiBwcm9kdWNlciBhY2NvcmRpbmcgdG8gaW5kZXgNCiAgICAgICAgICAgICAgIHBvbHltZXJfcHJvZHVjZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgdW5pcXVlIGlkZW50aWZpZXIsIG5hbWUgb2YgcHJvZHVjZXINCiAgICAgICAgICAgICAgIG5vX29mX2Fzc2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMsIG1ldHJpYywgbnVtYmVyIG9mIGFzc2V0cyBvZiB0aGUgcHJvZHVjZXINCiAgICAgICAgICAgICAgIHByb2R1Y3Rpb25fb2ZfaW5fc2NvcGVfcG9seW1lcnMgICAgICAgICAgICAgIG51bWVyaWMsIG1ldHJpYyBpbiBtaWxsaW9uIG1ldHJpYyB0b25zLCBwcm9kdWN0aW9uIG9mIHBsb2x5bWVycyB0aGF0IGFyZSBpbi1zY29wZSBvZiBwcmVjZWRpbmcgYW5hbHlzaXMNCiAgICAgICAgICAgICAgIGZsZXhpYmxlX2Zvcm1hdF9jb250cmlidXRpb25fdG9fc3VwX3dhc3RlICAgIG51bWVyaWMsIG1ldHJpYyBpbiBtaWxsaW9uIG1ldHJpYyB0b25zLCBmbGV4aWJsZSBmb3JtIG9mIGNvbnRyaWJ1dGlvbiB0byBzdXAgd2FzdGUNCiAgICAgICAgICAgICAgIHJpZ2lkX2Zvcm1hdF9jb250cmlidXRpb25fdG9fc3VwX3dhc3RlICAgICAgIG51bWVyaWMsIG1ldHJpYyBpbiBtaWxsaW9uIG1ldHJpYyB0b25zLCByaWdpZCBmb3JtIG9mIGNvbnRyaWJ1dGlvbiB0byBzdXAgd2FzdGUNCiAgICAgICAgICAgICAgIHRvdGFsX2NvbnRyaWJ1dGlvbl90b19zdXBfd2FzdGUgICAgICAgICAgICAgIG51bWVyaWMsIG1ldHJpYyBpbiBtaWxsaW9uIG1ldHJpYyB0b25zLCB0b3RhbCBjb250cmlidXRpb24gaXMgdGhlIHN1bSBvZiBmbGV4aWJsZSBhbmQgcmlnaWQNCiAgKGkpIG5vIG1pc3NpbmcgdmFsdWVzIGF0IGFsbCwgYWxzbyBpdCBpcyBhIHZlcnkgc21hbGwgZGF0YXNldA0KICAoaSkgbm8gZHVwbGljYXRlZCByb3dzDQogIChpKSBubyBjaGFuZ2VzIHdlcmUgbWFkZSB0byBkYXRhIHNldA0KDQotLS0NCmluc2lnaHRzIGZyb20gZGVzY3JpYmUgdW5pDQotLS0NCg0KICAoaSkgbm9fb2ZfYXNzZXRzIGlzIHBvaXNzb24gZGlzdHJpYnV0ZWQsIHdoZXJlIG1vc3QgcHJvZHVjZXIgb25seSBoYXZlIHVwIHRvIDkgKG1lZGlhbiA9IDYpIGFzc2V0cywgc29tZSBoYXZlIHVwIHRvIDI5ICh1cHBlciBmZW5jZSA9IDI2KSwgYW5kIG9ubHkgYSBmZXcgKG91dGxpZXJzKSBhcmUgYWJvdmUgdGhhdCAgICAgICAgd2l0aCB1cCB0byA4MiBhc3NldHMNCiAgKGkpIHByb2R1Y3Rpb25fb2ZfaW5fc2NvcGVfcG9seW1lcnMgaXMgcG9pc3NvbiBkaXN0cmlidXRlZCwgbGlrZXMgdmVyeSBzaW1pbGFyIHRvIG5vX29mX2Fzc2V0cywgbWVkaWFuIGlzIDAuOSwgdXBwZXIgZmVuY2UgaXMgMy40LCBtYXggaXMgMTEuNg0KICAgICAgLT4gbWlnaHQgY29ycmVsYXRlIHdpdGggbm9fb2ZfYXNzZXRzPw0KICAoaSkgZmxleGlibGVfZm9ybWF0X2NvbnRyaWJ1dGlvbl90b19zdXBfd2FzdGUgaXMgcG9pc3NvbiBkaXN0cmlidXRlZCwgbGlrZXMgdmVyeSBzaW1pbGFyIHRvIG5vX29mX2Fzc2V0cywgbWVkaWFuIGlzIDAuMiwgdXBwZXIgZmVuY2UgaXMgMS4xLCBtYXggaXMgNC43DQogIChpKSByaWdpZF9mb3JtYXRfY29udHJpYnV0aW9uX3RvX3N1cF93YXN0ZSBpcyBwb2lzc29uIGRpc3RyaWJ1dGVkLCBsaWtlcyB2ZXJ5IHNpbWlsYXIgdG8gbm9fb2ZfYXNzZXRzLCBtZWRpYW4gaXMgMC4yLCB1cHBlciBmZW5jZSBpcyAxLjEsIG1heCBpcyA0LjUsDQogICAgICB2ZXJ5IHNpbWlsYXIgdG8gZmxleGlibGVfZm9ybWF0X2NvbnRyaWJ1dGlvbl90b19zdXBfd2FzdGUsIGJ1dCB3aXRoIGxlc3Mgb3V0bGllcnMNCiAgKGkpIHJpZ2lkX2Zvcm1hdF9jb250cmlidXRpb25fdG9fc3VwX3dhc3RlIGlzIHBvaXNzb24gZGlzdHJpYnV0ZWQsIGxpa2VzIHZlcnkgc2ltaWxhciB0byBub19vZl9hc3NldHMgKGFnYWluKSwgbWVkaWFuIGlzIDAuNDUsIHVwcGVyIGZlbmNlIGlzIDEuOSwgbWF4IGlzIDUuOQ0KICAgICAgaXMgc3VtIG9mIGZsZXhpYmxlX2Zvcm0gKyByaWdpZF9mb3JtDQogIChpKSByYXRpb24gb2Ygc3VwX3dhc3RlIHRvIHByb2R1Y2VkIHBvbHltZXJzIGlzIGJldHdlZW4gbWluIDAuMyBhbmQgbWF4IDEuMCBhbmQgaGFzIG1lZGlhbiAwLjUsIG1vc3QgZGF0YSBsaWVzIGJldHdlZW4gMC40IGFuZCAwLjYsIGJ1dCB0aGVyZSBpcyBhIGhpZ2ggc3Bpa2UgYXQgMS4wICh3aXRoIGNvdW50IDE1KQ0KICAoaSkgY29tcGFyaW5nIHJpZ2lkX2Zvcm1hdCBhbmQgZmxleGlibGVfZm9ybWF0IHNob3dzIHRoYXQgdXAgdG8gdGhlIHVwcGVyIGZlbmNlIDEuMSwgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzaW1pbGFyLCBidXQgdGhlcmUgYXJlIG1vcmUgYmlnZ2VyICg+Mykgb3V0bGllcnMgaW4gZmxleGlibGUNCg0KYGBge3J9DQpuYW1lID0gJ3RvdGFsX2NvbnRyaWJ1dGlvbl90b19zdXBfd2FzdGUnDQpkZiA8LSBwbGFzdGljICU+JSByZW5hbWUodmFsdWUgPSB0b3RhbF9jb250cmlidXRpb25fdG9fc3VwX3dhc3RlKSAlPiUgc2VsZWN0KHZhbHVlKQ0KDQojIGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9nZW9tX2RvdHBsb3QuaHRtbA0KZG90cGxvdCA8LSBkZiAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUpKSArDQogICAgIyBnZW9tX2RlbnNpdHkoKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEpICsNCiAgICAjIGdlb21fZG90cGxvdChtZXRob2Q9Imhpc3RvZG90Iiwgc3RhY2tncm91cHMgPSBUUlVFLCBzdGFja3JhdGlvID0gMS4xLCBkb3RzaXplID0gMS4yLCBiaW53aWR0aCA9IDEpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMKSANCmRvdHBsb3QgPC0gZ2dwbG90bHkoZG90cGxvdCkgJT4lIGxheW91dCh5YXhpcyA9IGxpc3Qoc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSwgc2hvd2dyaWQgPSBGQUxTRSkpDQoNCmJveHBsb3QgPC0gZGYgJT4lDQogIGdncGxvdChhZXMoeCA9IDEsIHkgPSB2YWx1ZSkpICsNCiAgICBnZW9tX2JveHBsb3QoKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBjb29yZF9mbGlwKCkgKw0KICAgIGdndGl0bGUocGFzdGUoImRpc3RyaWJ1dGlvbiBvZiIsIG5hbWUsIHNlcD0iICIpKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwpIA0KYm94cGxvdCA8LSBnZ3Bsb3RseShib3hwbG90KSAlPiUgbGF5b3V0KHlheGlzID0gbGlzdChzaG93dGlja2xhYmVscyA9IEZBTFNFLCBzaG93Z3JpZCA9IEZBTFNFKSkNCg0KIyBodHRwczovL2dncGxvdDIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvZ2VvbV9xcS5odG1sIA0KcGxvdF9xcSA8LSBkZiAlPiUNCiAgZ2dwbG90KGFlcyhzYW1wbGUgPSB2YWx1ZSkpICsNCiAgICBnZW9tX3FxKGFscGhhID0gMC41KSArDQogICAgZ2VvbV9xcV9saW5lKCkgKw0KICAgIGNvb3JkX2ZsaXAoKSArDQogICAgdGhlbWVfbWluaW1hbCgpDQpwbG90X3FxIDwtIGdncGxvdGx5KHBsb3RfcXEpICU+JSBsYXlvdXQoeWF4aXMgPSBsaXN0KHNob3d0aWNrbGFiZWxzID0gRkFMU0UsIHNob3dncmlkID0gRkFMU0UpKQ0KDQojIGh0dHBzOi8vcGxvdGx5LmNvbS9yL3N1YnBsb3RzLw0KZmlnIDwtIHN1YnBsb3QoZG90cGxvdCwgYm94cGxvdCwgcGxvdF9xcSwgbnJvd3MgPSAzLCBtYXJnaW4gPSAwLCBoZWlnaHRzID0gYygwLjUsIDAuMiwgMC4zKSwgc2hhcmVYID0gVFJVRSkgDQoNCmZpZw0KYGBgDQpgYGB7cn0NCm5hbWUgPSBjKCdmbGV4aWJsZV9mb3JtYXRfY29udHJpYnV0aW9uX3RvX3N1cF93YXN0ZScsICdyaWdpZF9mb3JtYXRfY29udHJpYnV0aW9uX3RvX3N1cF93YXN0ZScpDQpkZiA8LSBwbGFzdGljICU+JSByZW5hbWUoZmxleGlibGUgPSBmbGV4aWJsZV9mb3JtYXRfY29udHJpYnV0aW9uX3RvX3N1cF93YXN0ZSwgcmlnaWQgPSByaWdpZF9mb3JtYXRfY29udHJpYnV0aW9uX3RvX3N1cF93YXN0ZSkgJT4lIHNlbGVjdChmbGV4aWJsZSwgcmlnaWQpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IGMoZmxleGlibGUscmlnaWQpKQ0KDQpib3hwbG90IDwtIGRmICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBuYW1lLCB5ID0gdmFsdWUsIGNvbG91ciA9IG5hbWUpKSArDQogICAgZ2VvbV9ib3hwbG90KCkgKw0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgY29vcmRfZmxpcCgpICsNCiAgICBnZ3RpdGxlKHBhc3RlKCJjb21wYXJlICIsIG5hbWVbMV0sICJhbmQiLCBuYW1lWzJdLCBzZXA9IiAiKSkgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMKSANCmJveHBsb3QgPC0gZ2dwbG90bHkoYm94cGxvdCkgJT4lIGxheW91dCh5YXhpcyA9IGxpc3Qoc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSwgc2hvd2dyaWQgPSBGQUxTRSkpDQoNCiMgaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL2dlb21fZG90cGxvdC5odG1sDQpkb3RwbG90IDwtIGRmICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB2YWx1ZSwgZmlsbCA9IG5hbWUpKSArDQogICAgIyBnZW9tX2RlbnNpdHkoKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEsIGFscGhhID0gMC41LCBwb3NpdGlvbiA9ICJpZGVudGl0eSIpICsNCiAgICAjIGdlb21fZG90cGxvdChtZXRob2Q9Imhpc3RvZG90Iiwgc3RhY2tncm91cHMgPSBUUlVFLCBzdGFja3JhdGlvID0gMSwgZG90c2l6ZSA9IDAuMjMsIGJpbndpZHRoID0gMC4xKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCkgDQpkb3RwbG90IDwtIGdncGxvdGx5KGRvdHBsb3QpICU+JSBsYXlvdXQoeWF4aXMgPSBsaXN0KHNob3d0aWNrbGFiZWxzID0gRkFMU0UsIHNob3dncmlkID0gRkFMU0UpKQ0KDQojIGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9nZW9tX3FxLmh0bWwgDQpwbG90X3FxIDwtIGRmICU+JQ0KICBnZ3Bsb3QoYWVzKHNhbXBsZSA9IHZhbHVlLCBjb2xvdXIgPSBuYW1lKSkgKw0KICAgIGdlb21fcXEoYWxwaGEgPSAwLjUpICsNCiAgICBnZW9tX3FxX2xpbmUoYWxwaGEgPSAwLjUpICsNCiAgICBjb29yZF9mbGlwKCkgKw0KICAgIHRoZW1lX21pbmltYWwoKSANCnBsb3RfcXEgPC0gZ2dwbG90bHkocGxvdF9xcSkgJT4lIGxheW91dCh5YXhpcyA9IGxpc3Qoc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSwgc2hvd2dyaWQgPSBGQUxTRSkpDQoNCiMgaHR0cHM6Ly9wbG90bHkuY29tL3Ivc3VicGxvdHMvDQpmaWcgPC0gc3VicGxvdChkb3RwbG90LCBib3hwbG90LCBwbG90X3FxLCBucm93cyA9IDMsIG1hcmdpbiA9IDAsIGhlaWdodHMgPSBjKDAuNSwgMC4yLCAwLjMpLCBzaGFyZVggPSBUUlVFKSANCg0KZmlnDQpgYGANCg0KLS0tDQppbnNpZ2h0cyBmcm9tIGRlc2NyaWJlIG11bHRpDQotLS0NCg0KDQoNCg0KDQoNCg==